From: Marco Trevisan (Treviño) Date: Fri, 5 Dec 2025 22:14:29 +0000 (+0100) Subject: environment: Ignore animation events after shutdown X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~44^2~50 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=240aa910dc842098c843cad498572660aee0c66f;p=gnome-shell.git environment: Ignore animation events after shutdown As soon as the shutdown starts, any animation event does not make sense, although during this phase the clutter timelines may still proceed and potentially calling invalid code in their callbacks. Prevent this from happening by disconnecting from any timeline signal we are connected to as soon as the `shutdown` signal is emitted Co-Authored-By: Florian Müllner Part-of: --- diff --git a/js/ui/environment.js b/js/ui/environment.js index 094b95018..8effcd240 100644 --- a/js/ui/environment.js +++ b/js/ui/environment.js @@ -18,6 +18,8 @@ import St from 'gi://St'; import * as SignalTracker from '../misc/signalTracker.js'; import {adjustAnimationTime} from '../misc/animationUtils.js'; +const sessionSignalHolder = new SignalTracker.TransientSignalHolder(); + setConsoleLogDomain('GNOME Shell'); Gio._promisify(Gio.DataInputStream.prototype, 'fill_async'); @@ -153,14 +155,16 @@ function _easeActor(actor, params) { const [transition] = transitions; if (transition && transition.delay) - transition.connect('started', () => prepare()); + transition.connectObject('started', () => prepare(), sessionSignalHolder); else prepare(); - if (transition) - transition.connect('stopped', (t, finished) => callback(finished)); - else + if (transition) { + transition.connectObject('stopped', (t, finished) => callback(finished), + sessionSignalHolder); + } else { callback(true); + } } function _easeAnimatableProperty(animatable, propName, target, params) { @@ -244,11 +248,12 @@ function _easeAnimatableProperty(animatable, propName, target, params) { transition.set_to(target); if (transition.delay) - transition.connect('started', () => prepare()); + transition.connectObject('started', () => prepare(), sessionSignalHolder); else prepare(); - transition.connect('stopped', (t, finished) => callback(finished)); + transition.connectObject('stopped', + (t, finished) => callback(finished), sessionSignalHolder); } // Add some bindings to the global JS namespace @@ -276,6 +281,9 @@ GObject.Object.prototype.disconnect_object = function (...args) { SignalTracker.registerDestroyableType(Clutter.Actor); +global.connectObject('shutdown', () => sessionSignalHolder.destroy(), + sessionSignalHolder); + Cairo.Context.prototype.setSourceColor = function (color) { const {red, green, blue, alpha} = color; const rgb = [red, green, blue].map(v => v / 255.0);